#include <bits/stdc++.h>
using namespace std;

/*
326. 3 的幂
已解答
简单
相关标签
premium lock icon
相关企业
给定一个整数，写一个函数来判断它是否是 3 的幂次方。如果是，返回 true ；否则，返回 false 。

整数 n 是 3 的幂次方需满足：存在整数 x 使得 n == 3x

 

示例 1：

输入：n = 27
输出：true
示例 2：

输入：n = 0
输出：false
示例 3：

输入：n = 9
输出：true
示例 4：

输入：n = 45
输出：false
 

提示：

-231 <= n <= 231 - 1
*/

// 法一
class Solution {
public:
    bool isPowerOfThree(int n) {
        // 3^19 = 1162261467是int范围内最大的3的幂次方
        // 如果n是正数且能整除这个最大的3的幂次方，则n也是3的幂次方
        return n > 0 && 1162261467 % n == 0;
    }
};

// 法二 
// 迭代循环
class Solution {
public:
    bool isPowerOfThree(int n) {
        if (n <= 0) return false;  // 负数和0不可能是3的幂次方
        while (n % 3 == 0) {       // 不断除以3
            n /= 3;
        }
        return n == 1;             // 最终结果为1则是3的幂次方
    }
};

// 法三
// 递归
class Solution {
public:
    bool isPowerOfThree(int n) {
        if (n <= 0) return false;   // 负数和0直接返回false
        if (n == 1) return true;    // 3^0 = 1，递归终止条件
        if (n % 3 != 0) return false; // 不能被3整除则不是3的幂次方
        return isPowerOfThree(n / 3); // 递归检查n/3
    }
};